package cz.pecinovsky.česky.oopnz.ufo;
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */

import cz.pecinovsky.česky.oopnz._000_.Run;


////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu +++++


/*******************************************************************************
 * Testovací třída UFOTest slouží ke komplexnímu otestování
 * třídy ...
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class UFOTest extends junit.framework.TestCase
{
    ITovárnaNaUFO továrna;
    Dispečer      dispečer;
    IUFO          ufo;



//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

//##############################################################################
//== KONSTRUKTORY A METODY VRACEJÍCÍ INSTANCE VLASTNÍ TŘÍDY ====================

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *  
     * @param název  Název konstruovaného testu
     */
    public UFOTest(String název)
    {
        super(název);
    }



//##############################################################################
//== PŘÍPRAVA A ÚKLID PŘÍPRAVKU ================================================

    /***************************************************************************
     * Vytvoření přípravku (fixture), tj. sady objektů, s nimiž budou všechny
     * testy pracovat a která se proto vytvoří před spuštěním každého testu.         
     */
    @Override
    protected void setUp()
    {
        továrna = new TovárnaNaUFO();
//        továrna = new TovárnaNaUFO_P();
    }


    /***************************************************************************
     * Úklid po testu - tato metoda se spustí po vykonání každého testu.
     */
    @Override
    protected void tearDown()
    {
    }


//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== VLASTNÍ TESTY =============================================================

    /***************************************************************************
     * Testuje základní funkcionalitu vytvořeného UFO.
     * Při spuštění tohoto testu stačí, aby prošel.
     */
    public void testUFO()
    {
        final int    TV   = Dispečer.VELIKOST;
        final double DTAH = IUFO.DTAH;
        final int    f    = 4;  //frekvence

        double px=TV,  py=TV;   //Pozice
        double rx=0,   ry=0;    //rychlsot
        double tx=0,   ty=0;    //tah
        
        dispečer = Dispečer.getDispečer(továrna, 1, false );
        ufo = dispečer.přistavUFO();
        //----------------------------------------------------------------------
        assertEquals( "Špatně nastavená vodorovná počáteční souřadnice", 
                      px, ufo.getX(), .01 );
        assertEquals( "Špatně nastavená svislá počáteční souřadnice", 
                      py, ufo.getY(), .01 );
        assertEquals( "Špatně nastavená počáteční vodorovná rychlost", 
                      rx, ufo.getXRychlost(), .01 );
        assertEquals( "Špatně nastavená počáteční svislá rychlost", 
                      ry, ufo.getYRychlost(), .01 );
        assertEquals( "Špatně nastavený počáteční vodorovný tah", 
                      tx, ufo.getXTah(), .01 );
        assertEquals( "Špatně nastavený počáteční svislý tah", 
                      ty, ufo.getXTah(), .01 );
        //----------------------------------------------------------------------
        rx = 16;
        ry = 32;
        ufo.setRychlost( rx, ry );
        assertEquals( "Metoda setRychlost špatně nastavuje vodorovnou rychlost", 
                      rx, ufo.getXRychlost(), .01 );
        assertEquals( "Metoda setRychlost špatně nastavuje svislou rychlost", 
                      ry, ufo.getYRychlost(), .01 );
        ufo.popojeď( 1 );
        assertEquals( "Metoda Popojeď špatně nastavuje vodorovnou souřadnici" +
                      " při nulovém tahu motorů a jednotkové frekvenci", 
                      px+=rx, ufo.getX(), .01 );
        assertEquals( "Metoda Popojeď špatně nastavuje svislou souřadnici" +
                      " při nulovém tahu motorů a jednotkové frekvenci", 
                      py+=ry, ufo.getY(), .01 );
        //----------------------------------------------------------------------
        ufo.vlevo();
        assertEquals( "Metoda vlevo špatně nastavuje vodorovný tah", 
                      tx-=DTAH, ufo.getXTah(), .01 );
        ufo.vlevo();
        assertEquals( "Metoda vlevo špatně nastavuje vodorovný tah", 
                      tx-=DTAH, ufo.getXTah(), .01 );
        assertEquals( "Metoda vlevo špatně nastavuje svislý tah", 
                      ty, ufo.getYTah(), .01 );
        //----------------------------------------------------------------------
        ufo.vzhůru();
        assertEquals( "Metoda vzhůru špatně nastavuje svislý tah", 
                      ty-=DTAH, ufo.getYTah(), .01 );
        ufo.vzhůru();
        assertEquals( "Metoda vzhůru špatně nastavuje svislý tah", 
                      ty-=DTAH, ufo.getYTah(), .01 );
        assertEquals( "Metoda vzhůru špatně nastavuje vodorovný tah", 
                      tx, ufo.getXTah(), .01 );
        //----------------------------------------------------------------------
        ufo.vypniMotory();
        assertEquals( "Metoda vypniMotory nevypíná vodorovný tah", 
                      tx=0, ufo.getXTah(), .01 );
        assertEquals( "Metoda vypniMotory nevypíná svislý tah", 
                      ty=0, ufo.getYTah(), .01 );
        //----------------------------------------------------------------------
        ufo.vpravo();
        assertEquals( "Metoda vpravo špatně nastavuje vodorovný tah", 
                      tx+=DTAH, ufo.getXTah(), .01 );
        ufo.vpravo();
        assertEquals( "Metoda vpravo špatně nastavuje vodorovný tah", 
                      tx+=DTAH, ufo.getXTah(), .01 );
        ufo.vpravo();
        assertEquals( "Metoda vpravo špatně nastavuje vodorovný tah", 
                      tx+=DTAH, ufo.getXTah(), .01 );
        assertEquals( "Metoda vpravo špatně nastavuje svislý tah", 
                      ty, ufo.getYTah(), .01 );
        //----------------------------------------------------------------------
        ufo.dolů();
        assertEquals( "Metoda dolů špatně nastavuje svislý tah", 
                      ty+=DTAH, ufo.getYTah(), .01 );
        ufo.dolů();
        assertEquals( "Metoda dolů špatně nastavuje svislý tah", 
                      ty+=DTAH, ufo.getYTah(), .01 );
        assertEquals( "Metoda dolů špatně nastavuje vodorovný tah", 
                      tx, ufo.getXTah(), .01 );
        //----------------------------------------------------------------------
        ufo.popojeď( 1 );
        assertEquals( "Metoda popojeď ovlivňuje vodorovný tah", 
                      tx, ufo.getXTah(), .01 );
        assertEquals( "Metoda popojeď ovlivňuje svislý tah", 
                      ty, ufo.getYTah(), .01 );
        assertEquals( "Metoda Popojeď špatně nastavuje vodorovnou rychlost" +
                      " při NEnulovém tahu motorů a jednotkové frekvenci", 
                      rx+=tx, ufo.getXRychlost(), .01 );
        assertEquals( "Metoda Popojeď špatně nastavuje svislou rychlost" +
                      " při NEnulovém tahu motorů a jednotkové frekvenci", 
                      ry+=ty, ufo.getYRychlost(), .01 );
        assertEquals( "Metoda Popojeď špatně nastavuje vodorovnou souřadnici" +
                      " při NEnulovém tahu motorů a jednotkové frekvenci", 
                      px+=rx, ufo.getX(), .01 );
        assertEquals( "Metoda Popojeď špatně nastavuje svislou souřadnici" +
                      " při NEnulovém tahu motorů a jednotkové frekvenci", 
                      py+=ry, ufo.getY(), .01 );
        //----------------------------------------------------------------------
        ufo.popojeď( f );
        assertEquals( "Metoda Popojeď špatně nastavuje vodorovnou rychlost" +
                      " při NEnulovém tahu motorů a NEjednotkové frekvenci", 
                      rx+=tx/f, ufo.getXRychlost(), .01 );
        assertEquals( "Metoda Popojeď špatně nastavuje svislou rychlost" +
                      " při NEnulovém tahu motorů a NEjednotkové frekvenci", 
                      ry+=ty/f, ufo.getYRychlost(), .01 );
        assertEquals( "Metoda Popojeď špatně nastavuje vodorovnou souřadnici" +
                      " při NEnulovém tahu motorů a NEjednotkové frekvenci", 
                      px+=rx/f, ufo.getX(), .01 );
        assertEquals( "Metoda Popojeď špatně nastavuje svislou souřadnici" +
                      " při NEnulovém tahu motorů a NEjednotkové frekvenci", 
                      py+=ry/f, ufo.getY(), .01 );
    }
    


    /***************************************************************************
     * Testuje správné nastavení rychlosti UFO.
     */
    public void testRychlost()
    {
        Dispečer disp = Dispečer.getDispečer(továrna);
        IUFO u1 = disp.přistavUFO();
             u1.setRychlost(10,10);
        IUFO u2 = disp.přistavUFO();
             u2.setRychlost(8,12);
        IUFO u3 = disp.přistavUFO();
             u3.setRychlost(6,12);
        IUFO u4 = disp.přistavUFO();
             u4.setRychlost(4,15);
        IUFO u5 = disp.přistavUFO();
             u5.setRychlost(0,20);
    }
    

    /***************************************************************************
     * Vytvoří standardnío dispečera a spustí tak hru.
     */
    public void testHra()
    {
        Dispečer.getDispečer(továrna);
    }

//%I+
//}
//%I-
//%%-  ----- Začátek ignorovaného závěrečného textu -----
////////////////////////////////////////////////////////////////////////////////
//== TESTY A METODA MAIN =======================================================
//%X+   Metoda připravená k vložení do testovacích tříd
     /** */
     public void testPřípravek() {}
//%X-


    /***************************************************************************
     * Třída, jejíž instance má na starosti úklid mezi jednotlivými testy,
     * který není možno zakomponovat do metody {@code tearDown()},
     * dokud nebudou studenti umět programovat.
     */
    private static class TearDown implements Run.ITD
    {
        /** {@inheritDoc} */
        @Override
        public void ukliď()
        {
        }
    }


    /***************************************************************************
     * Testovací metoda.
     */
    public static void test()
    {
        Run.tests(UFOTest.class,
                new TearDown(),
//                "testPřípravek",
                "testUFO",
                "testRychlost",
                "testHra",
                "");
        System.exit(0);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {  test();  }
}
